home *** CD-ROM | disk | FTP | other *** search
/ ADA Programming Guide / ADA Programming Guide.iso / ada_gnu / adainc / a-chahan.adb < prev    next >
Text File  |  1996-01-30  |  19KB  |  577 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT RUNTIME COMPONENTS                          --
  4. --                                                                          --
  5. --              A D A . C H A R A C T E R S . H A N D L I N G               --
  6. --                                                                          --
  7. --                                 B o d y                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.15 $                             --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- The GNAT library is free software; you can redistribute it and/or modify --
  14. -- it under terms of the GNU Library General Public License as published by --
  15. -- the Free Software  Foundation; either version 2, or (at your option) any --
  16. -- later version.  The GNAT library is distributed in the hope that it will --
  17. -- be useful, but WITHOUT ANY WARRANTY;  without even  the implied warranty --
  18. -- of MERCHANTABILITY  or  FITNESS FOR  A PARTICULAR PURPOSE.  See the  GNU --
  19. -- Library  General  Public  License for  more  details.  You  should  have --
  20. -- received  a copy of the GNU  Library  General Public License  along with --
  21. -- the GNAT library;  see the file  COPYING.LIB.  If not, write to the Free --
  22. -- Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.        --
  23. --                                                                          --
  24. ------------------------------------------------------------------------------
  25.  
  26. with Ada.Characters.Latin_1;      use Ada.Characters.Latin_1;
  27. with Ada.Strings.Maps;            use Ada.Strings.Maps;
  28. with Ada.Strings.Maps.Constants;  use Ada.Strings.Maps.Constants;
  29.  
  30. package body Ada.Characters.Handling is
  31. pragma Preelaborate (Handling);
  32.  
  33.    ------------------------------------
  34.    -- Character Classification Table --
  35.    ------------------------------------
  36.  
  37.    type Character_Flags is mod 256;
  38.    for Character_Flags'Size use 8;
  39.  
  40.    Control    : constant Character_Flags := 1;
  41.    Lower      : constant Character_Flags := 2;
  42.    Upper      : constant Character_Flags := 4;
  43.    Basic      : constant Character_Flags := 8;
  44.    Hex_Digit  : constant Character_Flags := 16;
  45.    Digit      : constant Character_Flags := 32;
  46.    Special    : constant Character_Flags := 64;
  47.  
  48.    Letter     : constant Character_Flags := Lower or Upper;
  49.    Alphanum   : constant Character_Flags := Letter or Digit;
  50.    Graphic    : constant Character_Flags := Alphanum or Special;
  51.  
  52.    Char_Map : constant array (Character) of Character_Flags :=
  53.    (
  54.      NUL                         => Control,
  55.      SOH                         => Control,
  56.      STX                         => Control,
  57.      ETX                         => Control,
  58.      EOT                         => Control,
  59.      ENQ                         => Control,
  60.      ACK                         => Control,
  61.      BEL                         => Control,
  62.      BS                          => Control,
  63.      HT                          => Control,
  64.      LF                          => Control,
  65.      VT                          => Control,
  66.      FF                          => Control,
  67.      CR                          => Control,
  68.      SO                          => Control,
  69.      SI                          => Control,
  70.  
  71.      DLE                         => Control,
  72.      DC1                         => Control,
  73.      DC2                         => Control,
  74.      DC3                         => Control,
  75.      DC4                         => Control,
  76.      NAK                         => Control,
  77.      SYN                         => Control,
  78.      ETB                         => Control,
  79.      CAN                         => Control,
  80.      EM                          => Control,
  81.      SUB                         => Control,
  82.      ESC                         => Control,
  83.      FS                          => Control,
  84.      GS                          => Control,
  85.      RS                          => Control,
  86.      US                          => Control,
  87.  
  88.      Space                       => Special,
  89.      Exclamation                 => Special,
  90.      Quotation                   => Special,
  91.      Number_Sign                 => Special,
  92.      Dollar_Sign                 => Special,
  93.      Percent_Sign                => Special,
  94.      Ampersand                   => Special,
  95.      Apostrophe                  => Special,
  96.      Left_Parenthesis            => Special,
  97.      Right_Parenthesis           => Special,
  98.      Asterisk                    => Special,
  99.      Plus_Sign                   => Special,
  100.      Comma                       => Special,
  101.      Hyphen                      => Special,
  102.      Full_Stop                   => Special,
  103.      Solidus                     => Special,
  104.  
  105.      '0' .. '9'                  => Digit + Hex_Digit,
  106.  
  107.      Colon                       => Special,
  108.      Semicolon                   => Special,
  109.      Less_Than_Sign              => Special,
  110.      Equals_Sign                 => Special,
  111.      Greater_Than_Sign           => Special,
  112.      Question                    => Special,
  113.      Commercial_At               => Special,
  114.  
  115.      'A' .. 'F'                  => Upper + Basic + Hex_Digit,
  116.      'G' .. 'Z'                  => Upper + Basic,
  117.  
  118.      Left_Square_Bracket         => Special,
  119.      Reverse_Solidus             => Special,
  120.      Right_Square_Bracket        => Special,
  121.      Circumflex                  => Special,
  122.      Low_Line                    => Special,
  123.      Grave                       => Special,
  124.  
  125.      'a' .. 'f'                  => Lower + Basic + Hex_Digit,
  126.      'g' .. 'z'                  => Lower + Basic,
  127.  
  128.      Left_Curly_Bracket          => Special,
  129.      Vertical_Line               => Special,
  130.      Right_Curly_Bracket         => Special,
  131.      Tilde                       => Special,
  132.  
  133.      DEL                         => Control,
  134.      Reserved_128                => Control,
  135.      Reserved_129                => Control,
  136.      BPH                         => Control,
  137.      NBH                         => Control,
  138.      Reserved_132                => Control,
  139.      NEL                         => Control,
  140.      SSA                         => Control,
  141.      ESA                         => Control,
  142.      HTS                         => Control,
  143.      HTJ                         => Control,
  144.      VTS                         => Control,
  145.      PLD                         => Control,
  146.      PLU                         => Control,
  147.      RI                          => Control,
  148.      SS2                         => Control,
  149.      SS3                         => Control,
  150.  
  151.      DCS                         => Control,
  152.      PU1                         => Control,
  153.      PU2                         => Control,
  154.      STS                         => Control,
  155.      CCH                         => Control,
  156.      MW                          => Control,
  157.      SPA                         => Control,
  158.      EPA                         => Control,
  159.  
  160.      SOS                         => Control,
  161.      Reserved_153                => Control,
  162.      SCI                         => Control,
  163.      CSI                         => Control,
  164.      ST                          => Control,
  165.      OSC                         => Control,
  166.      PM                          => Control,
  167.      APC                         => Control,
  168.  
  169.      No_Break_Space              => Special,
  170.      Inverted_Exclamation        => Special,
  171.      Cent_Sign                   => Special,
  172.      Pound_Sign                  => Special,
  173.      Currency_Sign               => Special,
  174.      Yen_Sign                    => Special,
  175.      Broken_Bar                  => Special,
  176.      Section_Sign                => Special,
  177.      Diaeresis                   => Special,
  178.      Copyright_Sign              => Special,
  179.      Feminine_Ordinal_Indicator  => Special,
  180.      Left_Angle_Quotation        => Special,
  181.      Not_Sign                    => Special,
  182.      Soft_Hyphen                 => Special,
  183.      Registered_Trade_Mark_Sign  => Special,
  184.      Macron                      => Special,
  185.      Degree_Sign                 => Special,
  186.      Plus_Minus_Sign             => Special,
  187.      Superscript_Two             => Special,
  188.      Superscript_Three           => Special,
  189.      Acute                       => Special,
  190.      Micro_Sign                  => Special,
  191.      Pilcrow_Sign                => Special,
  192.      Middle_Dot                  => Special,
  193.      Cedilla                     => Special,
  194.      Superscript_One             => Special,
  195.      Masculine_Ordinal_Indicator => Special,
  196.      Right_Angle_Quotation       => Special,
  197.      Fraction_One_Quarter        => Special,
  198.      Fraction_One_Half           => Special,
  199.      Fraction_Three_Quarters     => Special,
  200.      Inverted_Question           => Special,
  201.  
  202.      UC_A_Grave                  => Upper,
  203.      UC_A_Acute                  => Upper,
  204.      UC_A_Circumflex             => Upper,
  205.      UC_A_Tilde                  => Upper,
  206.      UC_A_Diaeresis              => Upper,
  207.      UC_A_Ring                   => Upper,
  208.      UC_AE_Diphthong             => Upper + Basic,
  209.      UC_C_Cedilla                => Upper,
  210.      UC_E_Grave                  => Upper,
  211.      UC_E_Acute                  => Upper,
  212.      UC_E_Circumflex             => Upper,
  213.      UC_E_Diaeresis              => Upper,
  214.      UC_I_Grave                  => Upper,
  215.      UC_I_Acute                  => Upper,
  216.      UC_I_Circumflex             => Upper,
  217.      UC_I_Diaeresis              => Upper,
  218.      UC_Icelandic_Eth            => Upper + Basic,
  219.      UC_N_Tilde                  => Upper,
  220.      UC_O_Grave                  => Upper,
  221.      UC_O_Acute                  => Upper,
  222.      UC_O_Circumflex             => Upper,
  223.      UC_O_Tilde                  => Upper,
  224.      UC_O_Diaeresis              => Upper,
  225.  
  226.      Multiplication_Sign         => Special,
  227.  
  228.      UC_O_Oblique_Stroke         => Upper,
  229.      UC_U_Grave                  => Upper,
  230.      UC_U_Acute                  => Upper,
  231.      UC_U_Circumflex             => Upper,
  232.      UC_U_Diaeresis              => Upper,
  233.      UC_Y_Acute                  => Upper,
  234.      UC_Icelandic_Thorn          => Upper + Basic,
  235.  
  236.      LC_German_Sharp_S           => Lower + Basic,
  237.      LC_A_Grave                  => Lower,
  238.      LC_A_Acute                  => Lower,
  239.      LC_A_Circumflex             => Lower,
  240.      LC_A_Tilde                  => Lower,
  241.      LC_A_Diaeresis              => Lower,
  242.      LC_A_Ring                   => Lower,
  243.      LC_AE_Diphthong             => Lower + Basic,
  244.      LC_C_Cedilla                => Lower,
  245.      LC_E_Grave                  => Lower,
  246.      LC_E_Acute                  => Lower,
  247.      LC_E_Circumflex             => Lower,
  248.      LC_E_Diaeresis              => Lower,
  249.      LC_I_Grave                  => Lower,
  250.      LC_I_Acute                  => Lower,
  251.      LC_I_Circumflex             => Lower,
  252.      LC_I_Diaeresis              => Lower,
  253.      LC_Icelandic_Eth            => Lower + Basic,
  254.      LC_N_Tilde                  => Lower,
  255.      LC_O_Grave                  => Lower,
  256.      LC_O_Acute                  => Lower,
  257.      LC_O_Circumflex             => Lower,
  258.      LC_O_Tilde                  => Lower,
  259.      LC_O_Diaeresis              => Lower,
  260.  
  261.      Division_Sign               => Special,
  262.  
  263.      LC_O_Oblique_Stroke         => Lower,
  264.      LC_U_Grave                  => Lower,
  265.      LC_U_Acute                  => Lower,
  266.      LC_U_Circumflex             => Lower,
  267.      LC_U_Diaeresis              => Lower,
  268.      LC_Y_Acute                  => Lower,
  269.      LC_Icelandic_Thorn          => Lower + Basic,
  270.      LC_Y_Diaeresis              => Lower
  271.    );
  272.  
  273.    ---------------------
  274.    -- Is_Alphanumeric --
  275.    ---------------------
  276.  
  277.    function Is_Alphanumeric (Item : in Character) return Boolean is
  278.    begin
  279.       return (Char_Map (Item) and Alphanum) /= 0;
  280.    end Is_Alphanumeric;
  281.  
  282.    --------------
  283.    -- Is_Basic --
  284.    --------------
  285.  
  286.    function Is_Basic (Item : in Character) return Boolean is
  287.    begin
  288.       return (Char_Map (Item) and Basic) /= 0;
  289.    end Is_Basic;
  290.  
  291.    ------------------
  292.    -- Is_Character --
  293.    ------------------
  294.  
  295.    function Is_Character (Item : in Wide_Character) return Boolean is
  296.    begin
  297.       return Wide_Character'Pos (Item) < 256;
  298.    end Is_Character;
  299.  
  300.    ----------------
  301.    -- Is_Control --
  302.    ----------------
  303.  
  304.    function Is_Control (Item : in Character) return Boolean is
  305.    begin
  306.       return (Char_Map (Item) and Control) /= 0;
  307.    end Is_Control;
  308.  
  309.    --------------
  310.    -- Is_Digit --
  311.    --------------
  312.  
  313.    function Is_Digit (Item : in Character) return Boolean is
  314.    begin
  315.       return Item in '0' .. '9';
  316.    end Is_Digit;
  317.  
  318.    --------------------------
  319.    -- Is_Hexadecimal_Digit --
  320.    --------------------------
  321.  
  322.    function Is_Hexadecimal_Digit (Item : in Character) return Boolean is
  323.    begin
  324.       return (Char_Map (Item) and Hex_Digit) /= 0;
  325.    end Is_Hexadecimal_Digit;
  326.  
  327.    ----------------
  328.    -- Is_ISO_646 --
  329.    ----------------
  330.  
  331.    function Is_ISO_646 (Item : in Character) return Boolean is
  332.    begin
  333.       return Item in ISO_646;
  334.    end Is_ISO_646;
  335.  
  336.    --  Note: much more efficient coding of the following function is possible
  337.    --  by testing several 16#80# bits in a complete word in a single operation
  338.  
  339.    function Is_ISO_646 (Item : in String) return Boolean is
  340.    begin
  341.       for J in Item'Range loop
  342.          if Item (J) not in ISO_646 then
  343.             return False;
  344.          end if;
  345.       end loop;
  346.  
  347.       return True;
  348.    end Is_ISO_646;
  349.  
  350.    ----------------
  351.    -- Is_Graphic --
  352.    ----------------
  353.  
  354.    function Is_Graphic (Item : in Character) return Boolean is
  355.    begin
  356.       return (Char_Map (Item) and Graphic) /= 0;
  357.    end Is_Graphic;
  358.  
  359.    ---------------
  360.    -- Is_Letter --
  361.    ---------------
  362.  
  363.    function Is_Letter (Item : in Character) return Boolean is
  364.    begin
  365.       return (Char_Map (Item) and Letter) /= 0;
  366.    end Is_Letter;
  367.  
  368.    --------------
  369.    -- Is_Lower --
  370.    --------------
  371.  
  372.    function Is_Lower (Item : in Character) return Boolean is
  373.    begin
  374.       return (Char_Map (Item) and Lower) /= 0;
  375.    end Is_Lower;
  376.  
  377.    ----------------
  378.    -- Is_Special --
  379.    ----------------
  380.  
  381.    function Is_Special (Item : in Character) return Boolean is
  382.    begin
  383.       return (Char_Map (Item) and Special) /= 0;
  384.    end Is_Special;
  385.  
  386.    ---------------
  387.    -- Is_String --
  388.    ---------------
  389.  
  390.    function Is_String (Item : in Wide_String) return Boolean is
  391.    begin
  392.       for J in Item'Range loop
  393.          if Wide_Character'Pos (Item (J)) >= 256 then
  394.             return False;
  395.          end if;
  396.       end loop;
  397.  
  398.       return True;
  399.    end Is_String;
  400.  
  401.    --------------
  402.    -- Is_Upper --
  403.    --------------
  404.  
  405.    function Is_Upper (Item : in Character) return Boolean is
  406.    begin
  407.       return (Char_Map (Item) and Upper) /= 0;
  408.    end Is_Upper;
  409.  
  410.    --------------
  411.    -- To_Basic --
  412.    --------------
  413.  
  414.    function To_Basic (Item : in Character) return Character is
  415.    begin
  416.       return Value (Basic_Map, Item);
  417.    end To_Basic;
  418.  
  419.    function To_Basic (Item : in String) return String is
  420.       Result : String (1 .. Item'Length);
  421.  
  422.    begin
  423.       for J in Item'Range loop
  424.          Result (J - (Item'First - 1)) := Value (Basic_Map, Item (J));
  425.       end loop;
  426.  
  427.       return Result;
  428.    end To_Basic;
  429.  
  430.    ------------------
  431.    -- To_Character --
  432.    ------------------
  433.  
  434.    function To_Character
  435.      (Item       : in Wide_Character;
  436.       Substitute : in Character := ' ')
  437.       return       Character
  438.    is
  439.    begin
  440.       if Is_Character (Item) then
  441.          return Character'Val (Wide_Character'Pos (Item));
  442.       else
  443.          return Substitute;
  444.       end if;
  445.    end To_Character;
  446.  
  447.    ----------------
  448.    -- To_ISO_646 --
  449.    ----------------
  450.  
  451.    function To_ISO_646
  452.      (Item       : in Character;
  453.       Substitute : in ISO_646 := ' ')
  454.       return       ISO_646
  455.    is
  456.    begin
  457.       if Item in ISO_646 then
  458.          return Item;
  459.       else
  460.          return Substitute;
  461.       end if;
  462.    end To_ISO_646;
  463.  
  464.    function To_ISO_646
  465.      (Item       : in String;
  466.       Substitute : in ISO_646 := ' ')
  467.       return       String
  468.    is
  469.       Result : String (1 .. Item'Length);
  470.  
  471.    begin
  472.       for J in Item'Range loop
  473.          if Item (J) in ISO_646 then
  474.             Result (J - (Item'First - 1)) := Item (J);
  475.          else
  476.             Result (J - (Item'First - 1)) := Substitute;
  477.          end if;
  478.       end loop;
  479.  
  480.       return Result;
  481.    end To_ISO_646;
  482.  
  483.    --------------
  484.    -- To_Lower --
  485.    --------------
  486.  
  487.    function To_Lower (Item : in Character) return Character is
  488.    begin
  489.       return Value (Lower_Case_Map, Item);
  490.    end To_Lower;
  491.  
  492.    function To_Lower (Item : in String) return String is
  493.       Result : String (1 .. Item'Length);
  494.  
  495.    begin
  496.       for J in Item'Range loop
  497.          Result (J - (Item'First - 1)) := Value (Lower_Case_Map, Item (J));
  498.       end loop;
  499.  
  500.       return Result;
  501.    end To_Lower;
  502.  
  503.    ---------------
  504.    -- To_String --
  505.    ---------------
  506.  
  507.    function To_String
  508.      (Item       : in Wide_String;
  509.       Substitute : in Character := ' ')
  510.      return        String
  511.    is
  512.       Result : String (1 .. Item'Length);
  513.  
  514.    begin
  515.       for J in Item'Range loop
  516.          Result (J) := To_Character (Item (J), Substitute);
  517.       end loop;
  518.       return Result;
  519.    end To_String;
  520.  
  521.    --------------
  522.    -- To_Upper --
  523.    --------------
  524.  
  525.    function To_Upper
  526.      (Item : in Character)
  527.      return  Character
  528.    is
  529.    begin
  530.       return Value (Upper_Case_Map, Item);
  531.    end To_Upper;
  532.  
  533.    function To_Upper
  534.      (Item : in String)
  535.       return String
  536.    is
  537.       Result : String (1 .. Item'Length);
  538.  
  539.    begin
  540.       for J in Item'Range loop
  541.          Result (J - (Item'First - 1)) := Value (Upper_Case_Map, Item (J));
  542.       end loop;
  543.  
  544.       return Result;
  545.    end To_Upper;
  546.  
  547.    -----------------------
  548.    -- To_Wide_Character --
  549.    -----------------------
  550.  
  551.    function To_Wide_Character
  552.      (Item : in Character)
  553.       return Wide_Character
  554.    is
  555.    begin
  556.       return Wide_Character'Val (Character'Pos (Item));
  557.    end To_Wide_Character;
  558.  
  559.    --------------------
  560.    -- To_Wide_String --
  561.    --------------------
  562.  
  563.    function To_Wide_String
  564.      (Item : in String)
  565.       return Wide_String
  566.    is
  567.       Result : Wide_String (1 .. Item'Length);
  568.  
  569.    begin
  570.       for J in Item'Range loop
  571.          Result (J - (Item'First - 1)) := To_Wide_Character (Item (J));
  572.       end loop;
  573.  
  574.       return Result;
  575.    end To_Wide_String;
  576. end Ada.Characters.Handling;
  577.